import 'package:flutter/material.dart';

import'package:xbaistack/theme/theme_extension.dart';
import 'package:xbaistack/utils/helper.dart';
import 'package:xbaistack/utils/local_storages.dart';

// shared_preferences 保存在本地数据的 Key
// 必须是唯一不重复的！
const String _DATA_KEY_ = "system.theme";

/// 集成 Provider 的自定义主题管理类
/// 核心要点：必须混入（或继承）ChangeNotifier 类
final class ThemeProvider with ChangeNotifier {
  bool _initialized = false;

  // 当前系统的主题模式
  late ThemeMode _mode;

  // 不同模式的主题数据
  // 为什么是两个？
  // 因为当 mode == ThemeMode.system 的时候可以自动选择用哪个，懂了吧~
  late AppTheme? _light;
  late AppTheme? _dark;

  // Getter 方法，提供给外部获取对应的数据
  ThemeMode get mode => _mode;
  AppTheme? get light => _light;
  AppTheme? get dark => _dark;
  bool get isFollowSystem => ThemeMode.system == _mode;

  /// 辅助方法，用于取保在应用初始化的时候载入本地配置数据
  ThemeProvider ensureInitialized(BuildContext context) {
    if (!_initialized) {
      final themeIndex = LocalStorages.getInt(_DATA_KEY_);
      _mode = ThemeMode.values[themeIndex];
      _loadTheme();
      _initialized = true;
    }
    return this;
  }

  /// 手动通知应用刷新 UI 组件
  void refresh() => notifyListeners();

  /// 保存当前主题模式
  void saveMode(ThemeMode mode) {
    _mode = mode;
    _loadTheme();
    LocalStorages.set(_DATA_KEY_, _mode.index);
  }

  /// 查找当前正在生效的主题数据
  AppTheme currentOf(BuildContext context) {
    if (isFollowSystem) {
      return (Helper.isDarkMode(context) ? _dark : _light)!;
    }
    // 当不是跟随系统的时候必然会存在一个主题，要么是 light，要么是 dark
    return (_light ?? _dark)!;
  }

  /// 加载主题数据
  void _loadTheme() {
    switch (_mode) {
      // light 的时候将 dark 置为空，节省空间
      case ThemeMode.light:
        _light = AppTheme.light();
        _dark = null;
        break;
      // dark 的时候将 dalightrk 置为空，节省空间
      case ThemeMode.dark:
        _light = null;
        _dark = AppTheme.dark();
        break;
      // system 的时候将同时设置两个是为了让 Flutter 自行决定使用哪个
      case ThemeMode.system:
        _light = AppTheme.light();
        _dark = AppTheme.dark();
        break;
    }
  }
}